هذا السؤال له بالفعل إجابات هنا: لا يوجد تحويل ضمني في عامل التحميل الزائد (إجابتين) مغلق منذ 7 سنوات. أنا أكتب غلافًا بسيطًا لنوع ابتدائي ، وأحاول تجنب الاضطرار إلى كتابة عدد كبير جدًا من نكهات المشغلين القياسيين. كنت آمل أن يساعد التحويل الضمني ، لكنه لا يفعل ذلك. إليك مثال مُجرد: هيكل كثافة العمليات { int _i ؛ كثافة العمليات (int i = 0): _i {i} {} عامل التشغيل Int + (const Int & rhs) {return _i + rhs._i؛} } ؛ int main (int argc، char * argv []) { (باطل) (كثافة العمليات (1) + 2) ؛ // بخير (باطل) (2 + كثافة العمليات (1)) ؛ // خطأ: معاملات غير صالحة للتعبير الثنائي ('int' و 'Int') } أنا أستخدم llvm. السطر الأول من التجميعات الرئيسية جيدة. الثاني يسبب خطأ. الآن ، ما كنت أتمنى أن يحدث في السطر الثاني هو أن 2 سيتم تحويلها ضمنيًا إلى Int (2) ، متبوعة باستدعاء عامل التشغيل +. لماذا لا يحدث ذلك؟ لماذا يحدث التحويل الضمني في السطر الأول؟
2021-03-01 08:17:05
يحدث ذلك في السطر الأول لأن العامل + المتاح الوحيد هو عامل التشغيل + (Int &) (الذي يحتوي على معلمة أولية ضمنية من Int لهذه الحالة). فشل السطر الثاني لأن المعامل الأول هو int وليس لديه أي دليل على أنه يحتاج إلى تحويله قبل محاولة العملية (لا يعرف أنه يحتاج إلى استخدام Int :: عامل +). يمكنك تجنب هذه المشكلة بجعل المشغل وظيفة صديق غير عضو (http://ideone.com/YCf7wX) هيكل كثافة العمليات { int _i ؛ كثافة العمليات (int i = 0): _i {i} {} مشغل Int صديق + (const Int & lhs، const Int & rhs) ؛ } ؛ عامل التشغيل + (const Int & lhs، const Int & rhs) { إرجاع lhs._i + rhs._i ؛ } انت مين() { كثافة العمليات أنا ؛ أنا + 5 ؛ 5 + ط ؛ العودة 0 ؛ } | ليس الجواب الذي تبحث عنه؟ تصفح الأسئلة الأخرى الموسومة بـ c ++ عامل تحويل الكلمة المفتاحية أو اطرح سؤالك الخاص.